Stringgrid - autom. zvet. vysky radku podle obsahu bunky - podruhe

Otázka od: js-delphi@quick.cz

24. 5. 2004 10:08

Odesilatel: Lebeda David <david.lebeda@comarr.cz>
Datum: Ctvrtek, 20.kvetna 2004 - 1:27 odp.

> Ahoj,
>
> podivej se na funkci DrawText. Das-li ji do parametru DT_CALCRECT,
> funguje tak, ze
> nevykresli text, ale vrati TRect, do ktereho se text vejde (viz
> napr. zdrojak TLabelu). Tj.
> takto zjistis rozmery textu a pak uz jen zbyva nastavit vysku
> radku. Viz help k DrawText.
>
> David Lebeda

Ahoj.
Zkusil jsem to, koukal jsem i do ruznych zdrojaku, ale nedari se mi to udelat.
  Muzete mi nekdo poradit kde delam chybu? Treba je to nejaka prkotina, ale
jak uz do toho dlouho koukam, tak ji treba nevidim...

procedure TfrmZaznamy.MujGridDrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
  Akce: Cardinal;
  R: TRect;
  Tmp: AnsiString;
begin
  With MujGrid Do Begin
    tmp:=Cells[ACol, ARow];
// Canvas.TextRect(Rect, Rect.Left+2, Rect.Top+2, Cells[ACol, ARow]);
      OnDrawCell:=nil;
      R:=Rect;
      Akce := DT_LEFT or DT_TOP or DT_WORDBREAK;
      if ACol = 4 then
      begin
        InflateRect(R, 2, 2);
        DrawText(Canvas.Handle, PChar(tmp), length(tmp), R,
        DrawTextBiDiModeFlags(DT_EXPANDTABS or Akce or DT_CALCRECT or
DT_NOPREFIX));
        if RowHeights[ARow]<Abs(R.Top-R.Bottom) then
                RowHeights[ARow]:=Abs(R.Top-R.Bottom);
      end;
      Canvas.FillRect(Rect);
      InflateRect(R, -2, -2);
      DrawText(Canvas.Handle, PChar(tmp), length(tmp), R, Akce);
      OnDrawCell:=MujGridDrawCell;
    End;
end;

Co je totiz divne, je to, ze kdyz se dostanu to teto udalosti, tak Rect ma
hodnoty napr. LT[244;21];RB[357;41]. No a kdyz chci zjistit, jak bude velky
tenhle "ctverec" po dosazeni textu, jeho zalomeni na vice radku atd., tak
dostanu LT[246;23];RB[249;36] coz je mnohem mensi nez ten puvodni - nevite teda
nekdo, kde delam chybu?

Diky vsem za Vas cas!
Jirka
--------------------------------------------------
Ing. Jiri Sokol; jiri.sokol@seznam.cz; 972 231 187
D6Prof+SP3; WinXPProf+SP1; FB 1.0.3
programator amater


Odpovedá: Lebeda David

31. 5. 2004 9:06

> procedure TfrmZaznamy.MujGridDrawCell(Sender: TObject; ACol, ARow:
> Integer;
> Rect: TRect; State: TGridDrawState);
> var
> Akce: Cardinal;
> R: TRect;
> Tmp: AnsiString;
> begin
> With MujGrid Do Begin
> tmp:=Cells[ACol, ARow];
> // Canvas.TextRect(Rect, Rect.Left+2, Rect.Top+2, Cells[ACol,
> ARow]);
> OnDrawCell:=nil;
> R:=Rect;
> Akce := DT_LEFT or DT_TOP or DT_WORDBREAK;
> if ACol = 4 then
> begin
> InflateRect(R, 2, 2);
> DrawText(Canvas.Handle, PChar(tmp), length(tmp), R,
> DrawTextBiDiModeFlags(DT_EXPANDTABS or Akce or DT_CALCRECT or
> DT_NOPREFIX)); if RowHeights[ARow]<Abs(R.Top-R.Bottom) then
> RowHeights[ARow]:=Abs(R.Top-R.Bottom);
> end;
> Canvas.FillRect(Rect);
> InflateRect(R, -2, -2);
> DrawText(Canvas.Handle, PChar(tmp), length(tmp), R, Akce);
> OnDrawCell:=MujGridDrawCell;
> End;
> end;
>
> Co je totiz divne, je to, ze kdyz se dostanu to teto udalosti, tak
> Rect ma hodnoty napr. LT[244;21];RB[357;41]. No a kdyz chci zjistit,
> jak bude velky tenhle "ctverec" po dosazeni textu, jeho zalomeni na
> vice radku atd., tak dostanu LT[246;23];RB[249;36] coz je mnohem mensi
> nez ten puvodni - nevite teda nekdo, kde delam chybu?

Ahoj,

a ten kod, cos sem napsal, se chova jak? Pri pouziti DrawText s DT_CALCRECT se
predpoklada, ze zadas obdelnik s pozadovanou sirkou, on do nej umisti text s
prislusnym zalomenim a vrati pak upraveny Bottom (pokud si to dobre pamatuji).

David Lebeda
************************************************************
David Lebeda, programator
ComArr s. r. o.
Tolarova 291, 533 51 Pardubice

Telefon: 466 889 111 (ustredna), 466 889 225 (prima linka)
Fax: 466 415 481
E-mail: lebeda@comarr.cz
http://www.comarr.cz
************************************************************